table of contents
DUP(2) | Руководство программиста Linux | DUP(2) |
ИМЯ¶
dup, dup2, dup3 - создать дубликат файлового дескриптора
ОБЗОР¶
#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); #define _GNU_SOURCE /* Смотрите feature_test_macros(7) */ #include <fcntl.h> /* Определение констант O_* */ #include <unistd.h> int dup3(int oldfd, int newfd, int flags);
ОПИСАНИЕ¶
Эти системные вызовы создают копию файлового дескриптора oldfd.
Для нового дескриптора dup() использует самый маленький свободный номер.
dup2() делает newfd копией oldfd, предварительно закрывая newfd, если нужно. Следует отметить, что:
- Если oldfd является некорректным файловым дескриптором, то вызов завершается с ошибкой, а newfd не закрывается.
- Если oldfd является корректным файловым дескриптором, а номер newfd совпадает с oldfd, то dup2() не делает ничего и возвращает значение newfd.
После успешного завершения из одного из этих системных вызовов старый и новый файловые дескрипторы являются взаимозаменяемыми. Они указывают на одно и то же открытое файловое описание (см. open(2)) и поэтому имеют общее файловое смещение и флаги состояния файла; например, если файловое смещение изменить с помощью lseek(2) через один из дескрипторов, то смещение изменится и для другого.
Эти два дескриптора имеют различные флаги дескриптора файла (флаг close-on-exec). Флаг close-on-exec (FD_CLOEXEC; см. fcntl(2)) у копии дескриптора сбрасывается.
dup3() похож на dup2(). Отличия заключаются в следующем:
- Вызывающий может принудительно установить флаг close-on-exec flag у нового файлового дескриптора, указав O_CLOEXEC в flags. Зачем это может быть нужно смотрите в open(2).
- Если oldfd равно newfd, то dup3() выдает ошибку EINVAL.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
В случае успеха данные системные вызовы возвращают новый дескриптор или -1, если произошла ошибка (в этом случае errno устанавливается должным образом).
ОШИБКИ¶
- EBADF
- oldfd не является открытым файловым дескриптором, или же newfd находится вне допустимого диапазона файловых дескрипторов.
- EBUSY
- (только в Linux) Может случиться в dup2() или dup3() при возникновении состязательности вызовов open(2) и dup().
- EINTR
- Вызов dup2() или dup3() был прерван каким-либо сигналом. Смотрите signal(7).
- EINVAL
- (dup3()) flags содержит некорректное значение. Или oldfd было равно newfd.
- EMFILE
- Процесс уже открыл максимальное количество файловых дескрипторов и пытается открыть ещё один.
ВЕРСИИ¶
dup3() был добавлен в Linux версии 2.6.27; поддержка в glibc доступна с версии 2.9.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
dup(), dup2(): SVr4, 4.3BSD, POSIX.1-2001.
dup3() есть только в Linux.
ЗАМЕЧАНИЯ¶
Ошибка, которую возвращает dup2(), отличается от той, что возвращает fcntl(..., F_DUPFD, ...), когда newfd находится вне допустимых пределов. На некоторых системах dup2() также иногда возвращает EINVAL как F_DUPFD.
Если newfd был открыт, то любые ошибки, которые могли бы случиться во время close(2), теряются. Осторожный программист не будет использовать dup2() или dup3() не закрыв сперва newfd.
СМОТРИТЕ ТАКЖЕ¶
2012-02-14 | Linux |